home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / tracker_4_31.lzh / tracker / Amiga / events.c < prev    next >
C/C++ Source or Header  |  1995-01-13  |  3KB  |  154 lines

  1. /* events.c 
  2.     vi:ts=3 sw=3:
  3.  */
  4. /* global events handler mechanism */
  5.  
  6. /* $Id: events.c,v 1.4 1995/01/13 13:31:35 espie Exp espie $
  7.  * $Log: events.c,v $
  8.  * Revision 1.4  1995/01/13  13:31:35  espie
  9.  * *** empty log message ***
  10.  *
  11.  * Revision 1.2  1994/01/09  04:49:18  Espie
  12.  * File requester !
  13.  */
  14.  
  15. #include <proto/exec.h>
  16. #include <dos/dos.h>
  17. #include "defs.h"
  18. #include "extern.h"
  19. #include "amiga/amiga.h"
  20.  
  21. ID("$Id: events.c,v 1.4 1995/01/13 13:31:35 espie Exp espie $")
  22.  
  23. LOCAL void init_events(void);
  24. LOCAL void (*INIT)(void) = init_events;
  25.  
  26. #define NUMBER_SIGNALS 32
  27.  
  28. LOCAL struct event_manager
  29.    {
  30.    ULONG    mask;       /* mask of signals we might wait for */
  31.    ULONG    req_mask;   /* special requester handler */
  32.    void     (*req_f)P((ULONG received));
  33.  
  34.    struct hook
  35.       {
  36.       void (*f)P((GENERIC data));
  37.       GENERIC data;
  38.       } hook[NUMBER_SIGNALS];
  39.    } manager;
  40.  
  41.  
  42. void install_signal_handler(int signal, void (*f)P((GENERIC data)), GENERIC data)
  43.    {
  44.    ULONG sigmask = 1 << signal;
  45.    
  46.    INIT_ONCE;
  47.    
  48.    if (f)
  49.       {
  50.       manager.mask |= sigmask;
  51.       manager.hook[signal].f = f;
  52.       manager.hook[signal].data = data;
  53.       }
  54.    else
  55.       {
  56.       manager.mask &= ~signal;
  57.       manager.hook[signal].f = 0;
  58.       }
  59.    }
  60.  
  61. void remove_signal_handler(int signal)
  62.    {
  63.    install_signal_handler(signal, 0, 0);
  64.    }
  65.  
  66. /* special case for reqtools.library ! */
  67. void install_req_handler(ULONG mask, void (*req_f)P((ULONG received)))
  68.    {
  69.    INIT_ONCE;
  70.  
  71.    if (req_f)
  72.       {
  73.       manager.req_mask = mask;
  74.       manager.req_f = req_f;
  75.       }
  76.    else
  77.       {
  78.       manager.req_mask = 0;
  79.       manager.req_f = 0;
  80.       }
  81.    }
  82.  
  83. void remove_req_handler(void)
  84.    {
  85.    install_req_handler(0, 0);
  86.    }
  87.  
  88. LOCAL void handle_events(ULONG received)
  89.    {
  90.    int i; 
  91.    ULONG mask;
  92.  
  93.    if ((received & manager.req_mask) && manager.req_f)
  94.       (*manager.req_f)(received & manager.req_mask);
  95.     for (i = 0, mask = 1; i < NUMBER_SIGNALS; i++, mask <<= 1)
  96.         if ((received & mask) && manager.hook[i].f)
  97.            (*manager.hook[i].f)(manager.hook[i].data);
  98.    }
  99.  
  100. void await_events()
  101.    {
  102.    ULONG received;
  103.    
  104.    INIT_ONCE;
  105.    received = Wait(manager.mask | manager.req_mask);
  106.    handle_events(received);
  107.    }
  108.  
  109. void check_events()
  110.    {
  111.    ULONG received;
  112.  
  113.    INIT_ONCE;
  114.    received = SetSignal(0, 0) & (manager.mask | manager.req_mask);
  115.       /* Clear signals received */
  116.    SetSignal(0, received);
  117.    handle_events(received);
  118.    }
  119.  
  120.  
  121. LOCAL int ask_break = FALSE;
  122.  
  123. void set_break()
  124.    {
  125.    ask_break = TRUE;
  126.    }
  127.  
  128. LOCAL void handle_ctrl_c(GENERIC nothing)
  129.    {
  130.    set_break();
  131.    }
  132.  
  133. LOCAL void init_events()
  134.    {
  135.    int i;
  136.  
  137.    manager.mask = 0;
  138.    manager.req_mask = 0;
  139.    manager.req_f = 0;
  140.    for (i = 0; i < NUMBER_SIGNALS; i++)
  141.       manager.hook[i].f = 0;
  142.       
  143.    install_signal_handler(SIGBREAKB_CTRL_C, handle_ctrl_c, 0);
  144.    }
  145.    
  146. int checkbrk()
  147.    {
  148.    INIT_ONCE;
  149.  
  150.    check_events();
  151.    return ask_break;
  152.    }
  153.  
  154.